﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.Transactions;
using System.Data.SqlClient;
using System.Data;
using EntitiesLayer;


namespace DAL.Repositories
{
        
    public class UsuarioRepository : IRepository<Usuario>
    {
        #region atributos
        
        private List<IEntity> _insertItems;
        private List<IEntity> _deleteItems;
        private List<IEntity> _updateItems;
        
        #endregion atributos


        public UsuarioRepository()
        {
            _insertItems = new List<IEntity>();
            _deleteItems = new List<IEntity>();
            _updateItems = new List<IEntity>();
        }

       
        public void Insert(Usuario entity)
        {
            _insertItems.Add(entity);
        }

        public void Delete(Usuario entity)
        {
            _deleteItems.Add(entity);
        }

        public void Update(Usuario entity)
        {
            _updateItems.Add(entity);
        }
        

        

        public IEnumerable<Usuario> GetAll()
        {
            List<Usuario> listaAustronautas = null;
            //SqlCommand cmd = new SqlCommand();
            //DataSet ds = DAL.DBAccess.ExecuteSPWithDS(ref cmd, "nombre");//falta hacr un procedimiento que liste todos 

            //if (ds.Tables[0].Rows.Count > 0) 
            //{
            listaAustronautas = new List<Usuario>();
            //   foreach (DataRow dr in ds.Tables[0].Rows) 
            //   {
            //                   
            //   }
            //}
            return listaAustronautas;
        }

        public Usuario GetById(int id)
        {
            Usuario objUsuario = null;

            //var sqlQuery = "SELECT Id, Nombre, Precio FROM Producto WHERE id = @idProducto";
            //SqlCommand cmd = new SqlCommand(sqlQuery);
            //cmd.Parameters.AddWithValue("@idProducto", id);

            //var ds = DBAccess.ExecuteQuery(cmd);

            //if (ds.Tables[0].Rows.Count > 0)
            //{
            //    var dr = ds.Tables[0].Rows[0];

            //   
            //}
            return objUsuario;
            
        }


        public void Save()
        {
      
            using (TransactionScope scope = new TransactionScope())
            {
                try
                {
                    if (_insertItems.Count > 0)
                    {
                        foreach (Usuario objUsuario in _insertItems)
                        {
                            
                        }
                    }

                    if (_updateItems.Count > 0)
                    {

                    }

                    if (_deleteItems.Count > 0)
                    {

                    }

                    scope.Complete();
                }

                catch (ApplicationException ex)
                {
                    Console.WriteLine("error" + ex);
                }

                finally 
                {
                    Clear(); //--> este clear llama al metodo que vuele a los list a la normalidad
                }
               
            }
           

        }

        public void Clear()
        {
            _insertItems.Clear();
            _deleteItems.Clear();
            _updateItems.Clear();
        }
        /*
        private void Insertusuario(Usuario objUsuario) 
        {
            try 
            {
                SqlCommand sql = new SqlCommand();
                //revisar si los nombres de los parametros son los del procedure o cualquiera sin importar
                sql.Parameters.Add(new SqlParameter("@nombre", objUsuario.Nombre));

                DataSet ds = DBAccess.ExecuteSPWithDS(ref sql, "pa_agregar_usuario");
           
            }
            catch(Exception x)
            {
                Console.WriteLine("error inesperado" + x);
            }
        }*/


        public Usuario iniciarSesion(String pnumeroCarnet)
        {
            Usuario objUsuario = null;
            try
            {
                SqlCommand sql = new SqlCommand();
                //revisar si los nombres de los parametros son los del procedure o cualquiera sin importar
                sql.Parameters.Add(new SqlParameter("@numero_carnet", pnumeroCarnet));
                

                DataSet ds = DBAccess.ExecuteSPWithDS(ref sql, "pa_iniciar_sesion");
                

                if (ds.Tables[0].Rows.Count > 0)
                {
                    foreach (DataRow dr in ds.Tables[0].Rows)
                    {
                        objUsuario = new Usuario(
                            Convert.ToInt16(dr["id"]),
                            dr["primerNombre"].ToString(),
                            dr["segundoNombre"].ToString(),
                            dr["primerApellido"].ToString(),
                            dr["segundoApellido"].ToString(),
                            dr["tipoIdentificacion"].ToString(),
                            dr["identificacion"].ToString(),
                            dr["nacionalidad"].ToString(),
                            dr["alias"].ToString(),
                            dr["fechaNacimiento"].ToString(),
                            dr["genero"].ToString(),
                            dr["correoElectronico"].ToString(),
                            dr["telefono"].ToString(),
                            dr["celular"].ToString(),
                            dr["numeroCarnet"].ToString(),
                            Convert.ToBoolean(dr["estado"]),
                            Convert.ToInt16(dr["idRol"])
                        );
                    }   
                }
            }
            catch (Exception)
            {}
            return objUsuario;
        }




        public List<int> cargarPermisos(int pidRol) 
        {
            List<int> listaPermisos = new List<int>();
            try
            {
                SqlCommand sql = new SqlCommand();
               
                sql.Parameters.Add(new SqlParameter("@id_rol", pidRol));
                
                DataSet ds = DBAccess.ExecuteSPWithDS(ref sql, "cargar_permisos");

                if (ds.Tables[0].Rows.Count > 0)
                {
                    foreach (DataRow dr in ds.Tables[0].Rows)
                    {
                        listaPermisos.Add(Convert.ToInt32(dr["codigoPermiso"]));
                    }
                }
            }
            catch (Exception)
            {}

            return listaPermisos;
        }



        public Boolean comprobarusuario(String pnumeroCarnet, String pcontrasena)
        {
            Boolean existeUsuario = false;

            try
            {
                SqlCommand sql = new SqlCommand();
                //revisar si los nombres de los parametros son los del procedure o cualquiera sin importar
                sql.Parameters.Add(new SqlParameter("@numero_carnet", pnumeroCarnet));
                sql.Parameters.Add(new SqlParameter("@contrasenna", pcontrasena));

                DataSet ds = DBAccess.ExecuteSPWithDS(ref sql, "pa_comprobar_usuario");

                if (ds.Tables[0].Rows.Count > 0)
                {
                    foreach (DataRow dr in ds.Tables[0].Rows)
                    {
                       existeUsuario = Convert.ToBoolean(dr["existeUsuario"]);
                    }
                }
            }
            catch (Exception)
            {}
            return existeUsuario;
        }
        


        public Boolean comprobarCorreo(String pcorreo) 
        {
            Boolean existeCorreo = false;
            try
            {
                SqlCommand sql = new SqlCommand();
                sql.Parameters.Add(new SqlParameter("@correo", pcorreo));
                DataSet ds = DBAccess.ExecuteSPWithDS(ref sql, "comprobar_correo");

                if (ds.Tables[0].Rows.Count > 0)
                {
                    foreach (DataRow dr in ds.Tables[0].Rows)
                    {
                        existeCorreo = Convert.ToBoolean(dr["existeCorreo"]);
                    }
                }
            }
            catch (Exception)
            {}
            return existeCorreo;
        }

        public List<String> obtenerInfoUsuario(String pcorreo) 
        {
            List<String> infousuario = new List<String>();

            try
            {
                SqlCommand sql = new SqlCommand();
                sql.Parameters.Add(new SqlParameter("@correoElectronico", pcorreo));
                DataSet ds = DBAccess.ExecuteSPWithDS(ref sql, "info_usuario");

                if (ds.Tables[0].Rows.Count > 0)
                {
                    foreach (DataRow dr in ds.Tables[0].Rows)
                    {
                        infousuario.Add(dr["nombreUsuario"].ToString());
                        infousuario.Add(dr["numeroCarnet"].ToString());
                        infousuario.Add(dr["contrasenna"].ToString());
                    }
                }
            }

            catch (Exception)
            {}
            return infousuario;
        }
    }

}
